묻고 답해요
129만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바스크립트로 알아보는 함수형 프로그래밍 (ES5)
_get 함수 부분이 너무 이해가 안갑니다 ㅠ
안녕하세요.지금 강의를 여러번 돌려보고 천천히 생각하는데도전혀 이해가 되지 않습니다 ㅠ // 2. _get 만들어 좀 더 간단하게 하기 console.log( _map( _filter(users, function(user) { return user.age >= 30; }), _get('name'))); // function(user) { return user.name}여기 코드에서 _get('name')에 인자가 더 들어가야되지않나여??...예시들 중에서var user1 = users[0]; console.log(user1.name); console.log(_get(user1, 'name')); console.log(_get('name')(user1)); var get_name = _get('name'); console.log( get_name(user1) );여기서 보면 _get('name')(user1)이라고 썼는데_map에서 사용했을때 어떻게 저렇게 동작이 되는지 잘 이해가 안되네요 ㅠ 설명 좀 부탁드리겠습니다 ㅠ다른 질문들 보니 저랑 같은 생각하시는 분께 답변이차근차근 생각해보라고 되어있는데 계속 봐도 이해가 안가서 다시 질문올립니다 ㅠ
-
미해결함수형 프로그래밍과 JavaScript ES6+
배열에서 몇개만 취득하는 것이 아닐 경우
안녕하세요, 강사님 :)강의내용에서 age<20, take(3) 처럼 3개만 뽑는 경우엔 지연성으로 인해 3개만 뽑고 뒤에 배열들은 탐색하지 않겠지만 age<20의 사용자를 모두 뽑는 경우엔 이렇게 지연성으로 하나 일반 map,filter를 사용하나 성능상에 차이가 없는 것이죠?
-
미해결함수형 프로그래밍과 JavaScript ES6+
평가 순서에 대해 질문이 있습니다!
안녕하세요. 먼저 좋은 강의와 항상 빠르게 답변을 해주셔서 너무 감사합니다. 질문은 아래와 같습니다.지연성 1 파트에 있는 평가순서 강의를 복습하면서 클레이슬리 컴포지션의 평가 순서를 생각해보았는데, 제 생각이 맞는지 궁금합니다. 예시코드// gogo( [1, 2, 3, 4, 5], L.map((n) => Promise.resolve(n)), L.filter((n) => n % 2), take(2), console.log // [1, 3] ); // takeexport const take = curry((l, iter) => { let result = []; iter = iter[Symbol.iterator](); // recur()가 실행되면, 여기서 다시 시작을 하는데. // iter.next()가 실행되면, return (function recur() { let cur; while (!(cur = iter.next()).done) { const value = cur.value; // a가 promise 인 경우 재귀함수를 이용해서 처리함 if (value instanceof Promise) return ( value // .then((v) => (result.push(v), result).length === l ? result : recur() ) // filter에서 reject가 되면, catch에 걸리고 e가 nop이면 recur()를 실행한다. .catch((e) => (e === nop ? recur() : Promise.reject(e))) ); result.push(value); if (result.length === l) return result; } return result; })(); });// L.filterconst nop = Symbol("nop"); export const L.filter = curry(function* (f, iter) { for (const a of iter) { const b = go1(a, f); if (b instanceof Promise) yield b.then((b) => (b ? a : Promise.reject(nop))); else if (b) yield a; } });// L.mapexport const L.Map = curry(function* (f, iter) { for (const el of iter) { yield go1(el, f); } }); 평가 순서take 함수 내, iter.next() 평가를 시도 → L.filter로 이동L.filter 내, iter.next() 평가를 시도 → L.map 으로 이동L.map 내, inter.next() 평가를 시도한다. → [1, 2, 3..] 를 iter 로 받았기 때문에 1로 평가 된다.L.filter 로 돌아와, L.map으로부터 평가받은 Promise.resolve(1) 이라는 값(b)으로 내부 로직을 수행한다.b의 인스턴스가 Promise라면, b.then을 실행하고 a 또는 Promise.reject을 한다.여기서 a는 Promise 이다.b의 인스턴스가 Promise가 아니라면, result.push(value); 을 실행하고 while로 순회한다.L.filter 의 평가가 끝나면 take 함수로 돌아온다take로 전해지는 L.filter 의 평가값은 4개 중에 하나일 것이다.a → take 내에서 result.push 가 실행됨Promise.resolve(a) → take 내에서 .then 절이 실행됨.Promise.reject(nop) → take 내에서 .catch 절이 실행되고 recur() 를 실행함Promise.reject(e) → take 내에서 .catch절이 실행되고, Promise.reject(e) 로 이어짐recur()가 실행되면, take 에서 실행된 첫번째 while 사이클이 끝나면서, 다시 recur()가 실행되며 iter.next()가 평가할때 위 과정을 다시 반복한다. take에 있는 while 사이클이 return되고 recur() 함수 실행이 종료됐음에도 iter.next()의 값이 이전값에서 이어지는 이유는 recur() 와 iter가 클로저이기때문이다.
-
미해결함수형 프로그래밍과 JavaScript ES6+
3차원 배열, 4차원 배열
2차원 배열일 경우에는 L.flatten 코드로 가능하지만 3차원 배열, 4차원 배열일 경우엔 어떻게 구현해야 좋을까요?아래와 같이 구현할려고하니 deepFlatten을 해결해주는 곳이 없어서 3차원 배열 이상은 이터레이터로 리턴받고 있습니다.ㅠㅠconst isIterable = a => a && a[Symbol.iterator]; function* deepFlatten(iter){ for(const a of iter){ if (isIterable(a)) yield deepFlatten(a) else yield a; } } L.flatten = function* (iter) { for (const a of iter) { if (isIterable(a)) yield deepFlatten(a) else yield a; } }; var it = L.flatten([[1, [1,2,3]], 3, 4, [5, 6], [7, 8, 9]]); log(take(Infinity, it))[deepFlatten, 3, 4, deepFlatten, deepFlatten]
-
해결됨자바스크립트로 알아보는 함수형 프로그래밍 (ES5)
10:18 아무래도 클로저가 리스프? 다 보니까
10:18 아무래도 클로저가 리스프? 다 보니까 라는 말씀이 있는데요 검색해보니까 아마도 LISP 이걸 말하는 것 같아요 선생님이 설명해주셨으면 더 좋았눈뎁 ㅠ-ㅠ 이 부분 설명이 없어서 조금 아쉬워요 강의는 정말 감사히 듣고있습니다
-
해결됨함수형 프로그래밍과 JavaScript ES6+
엄격한 계산과 느긋한 계산의 트레이드 오프
안녕하세요. 좋은 강의 항상 잘 듣고 있습니다. 함수형 프로그래밍에 익숙하지 않는 상태로 여기까지 듣고 의문점이 하나 생겨서 질문 남깁니다. 지금까지의 강의 내용으로 보면 효율성등에서 항상 느긋한 계산 좋아보이는데 굳이 map과 filter등을 구현하는데 있어 'L.'을 붙여 굳이 메소드를 나눈 이유는 무엇인가요? 엄격한 계산과 느긋한 계산이 각각 트레이드오프를 가지고 있으며 경우에 따라 선택해서 써야하는 것인가요? 아니면 느긋한 계산이 좋다는 것을 보여주기 위한 비교를 위해 엄격한 계산도 보여주는 것인가요?
-
미해결함수형 프로그래밍과 JavaScript ES6+
예제 파일이 정상적으로 출력이 안됩니다.
. 안녕하세요 다름이 아니라 예제파일을 다운받아서 강의를 보면서 같이 진행을 하고있는데요, 예제 파일이 정상적으로 로그창에 출력이 안되는데.. 혹시 이유가 뭔지 알수있을까요? 비주얼 스튜디오 코드를 사용하고있습니다!
-
미해결함수형 프로그래밍과 JavaScript ES6+
제네레이터 질문합니다!
안녕하세요! 다름이 아니라 제네레이터 함수가 작동하지 않아서 질문드립니다..! 강의를 보면 선생님같은경우는 함수명앞에 * 별표가 잘 붙어있는데 저같은경우는 보면 * 별표가 function 옆으로 붙어버립니다. 함수명 옆에 별표를 붙여도 저장누르는 순간 펑션옆으로 별이 이동합니다.. 그리고, 콘솔로그도 나오질 않습니다. 아마 제네레이터 함수가 정상적으로 작동되질 않는것같은데, 이유가 뭔지 알수있을까요?
-
미해결함수형 프로그래밍과 JavaScript ES6+
ES6 과의 차이점
너무나 좋은 강의로 함수형 프로그래밍 에 대해서 조금씩 감을 잡아 나가는 방향입니다. 함수의 비즈니스 로직을 숨기고 함수의 표현식들을 드러내서 이 과정에 사이드 이펙트를 없애고 직관적으로 읽기 좋은 형태 를 지니게 되는 것 같습니다. 다만, OOP 에서의 메서드 와의 다른 점으로는 내외부 함수의 교류가 없다 정도인 것 같습니다. 다만 여기까지가 주요한 맥락이라면 아래 코드가 결국은... const sum = (func, iter) => go( iter, map(func), reduce(add) ); 이러한 코드 와의 별다른 차별점은 없는 것으로 해석되지 않을까요? const sum = (func, iter) => iter.map(func).reduce(add); 이렇게 이해 하였는데 맞는 것일까요?
-
미해결함수형 프로그래밍과 JavaScript ES6+
(res.push(a),res).length;
(res.push(a),res).length; 이부분은 어떻게 평가되는건가요..?? 같은 질문하신분의 답변을 봐도 이해가 안됩니다 ㅠ.
-
해결됨함수형 프로그래밍과 JavaScript ES6+
infinity
`for(const i of infinity(1)) log(i)`를 하게되면 무한히 값이 생성되서 브라우저가 멈춰버리는데요. odds안에 저렇게 무한히 생성되는 아이를 for문에 조건문으로 적어주었을때 이미 값은 내부적으로 다 만들어져있는 상태인가요?
-
해결됨Kevin의 알기 쉬운 RxJava 1부
concatEager( ) 연산자에 관하여
안녕하세요, 해당 강의에서 materialize / dematerialize 파트에서 언급된 concatEager( ) 연산자에 알아보면서 어떻게 사용해야하는 것인지 정확히 알고 싶습니다. - Observable.java (concat 연산자) @CheckReturnValue@NonNull@SchedulerSupport(SchedulerSupport.NONE)public static <T> Observable<T> concat(ObservableSource<? extends T> source1, ObservableSource<? extends T> source2) { ObjectHelper.requireNonNull(source1, "source1 is null"); ObjectHelper.requireNonNull(source2, "source2 is null"); return concatArray(source1, source2);} - Observable.java (concatEager 연산자) @CheckReturnValue@SchedulerSupport(SchedulerSupport.NONE)public static <T> Observable<T> concatEager(ObservableSource<? extends ObservableSource<? extends T>> sources) { return concatEager(sources, bufferSize(), bufferSize());} 위 API 소스를 보다시피 concatEager의 파라미터는 'ObservableSource<? extends ObservableSource<? extends T>>' 타입을 넣어야 한다고 명시가 되어있는데요, 저 모양이 예제 'ObservableMaterialExample02.java'처럼 Observable.just( ... )의 파라미터에 Observable 넣어야하는 형태인건가요? 저런 타입이 어떠한 모양인지 감이 안잡혀서 여쭤봅니다.
-
미해결함수형 프로그래밍과 JavaScript ES6+
질문있습니다...
reduce 함수에서 acc인자로 비동기적인 값이 들어올 때 처리를 위해 유명함수 라는거를 사용하셨는데... 그런데 if (acc instanceof Promise) return acc.then(recur) 이 부분에서 왜 return 이 들어가야 되는건지 모르겠어요... 그냥 acc.then(recur) 하고 실행만 해주면 함수 실행되는거 아닌가요 ??? 그런데 ... return 없이 실행 하니깐 값이 제대로 안나오더라구요
-
미해결함수형 프로그래밍과 JavaScript ES6+ 응용편
"안전한 합성에 대해" 강의 관련해서 질문드립니다
먼저, 덕분에 함수형 프로그래밍에 조금씩 친숙해지고 있어서 너무 감사합니다. 다름 아니라, "안전한 합성에 대해" 강의 관련해서 궁금한 점이 있어서 질문드립니다~ "안전한 합성에 대해" 강의에서 에러가 터지지 않게 배열로 만들어 안전하게 합성한다고 하셨고 예전 feConf에서 유인동님의 "ES6+ 비동기 프로그래밍과 실전 에러 핸들링" 영상에서는 에러를 뿜어내는게 좋다고 말씀하셨는데, 에러를 뿜는게 좋으면, map을 이용해서 만드는 의미가 어떤게 있나 라는 궁금증이 들더라구요. 어떤 맥락에서는 에러를 뿜는게 좋고, 어떤 맥락에서는 map을 이용해서 에러를 뿜지 않는게 좋은지 궁금합니다.
-
미해결함수형 프로그래밍과 JavaScript ES6+ 응용편
fxsql 사용 중 질문이 있습니다.
안녕하세요. 강의중 소개된 fxsql과 관련하여 질문이 있어서 남기게 되었습니다. - fxsql의 ASSOCIATE 를 사용시 서로다른 테이블들을 각각 select하여 데이터를 가져오는것으로 확인하였는데 join을 사용하여 쿼리를 날리는 방법은 없는것일까요? - fxsql로 구성된 서버를 local, staging, production과 같은 서로다른 환경으로 분리하여 사용 시 데이터베이스 테이블이나 필드같은 부분은 어떤식으로 동기화하여 사용하는것이 best practice일까요? 좋은강의 정말감사드리며 다음 강의가나오길 기대하고 있습니다!
-
미해결함수형 프로그래밍과 JavaScript ES6+ 응용편
퍼포먼스/가독성
초보적인 질문입니다 ㅠㅠ 1.지연 평가/즉시 평가 예제에서 L.map과 L.filter그리고 reduce를 조합해서 써주셨는데요 이전 강의부터 궁금했던 건데 지연 평가를 한다고 해도, reduce의 경우 takeAll처럼 결국 이터러블/이터레이터를 모두 평가를 해야되기 때문에 지연 평가나 즉시 평가나 시간복잡도/퍼포먼스적인 부분에서 차이가 없는 것이 아닌가 생각되는데 이것이 맞나요? 제 생각에 지연 평가는 take(작은 수)로 이터러블의 모든 요소를 순회/평가하지 않아도 되는 경우에만 의미가 있는 것 같은데, 뭔가 놓친 부분이 있는 것은 아닌지 궁금합니다 2.reduce only / reduce + map + filter 강의에서 말씀해주신 부분에서만 추측해보자면, 함수 합성으로 하시는 이유가 추상화/재사용성/가독성 등의 이유가 주된 이유인 것 같습니다. 그런데, map, filter, reduce의 조합이면 일단 순회를 3차례 돌아야 하는 것이고, reduce만 쓰면 순회는 1차례에서 끝날 텐데, 혹시 퍼포먼스적인 부분에서는 차이가 없나요? 1번 질문이랑 연결해서 (이터러블의 모든 요소를 순회해야 한다면) 지연 평가를 한다고 해도 평가를 그때 그때 필요한 시점에 하는 것일 뿐, 평가를 덜해도 되는 것이 아니기 때문에 제 생각에는 최종 평가까지 걸리는 시간이 더 들 것 같은데... (console.time을 찍어봤지만 간단한 예제라서 그런지 실행 시간에는 별 차이를 느끼지 못했습니다...)
-
미해결함수형 프로그래밍과 JavaScript ES6+
a.then()을 return 하는 이유가 뭐고 어떻게 동작하는 건가요?
5:18 쯤에 return a.then()을 작성하시는데 여기서 a.then을 왜 return 하는지 모르겠어요. if (a instanceof Promise) { a.then(a => { res.push(a); if (res.length == l) return res; } } else { res.push(a); if (res.length == l) return res; } 그냥 이렇게 작성하면 안 되는 건가요? 그 뒤에 재귀함수로 작성하기 위해서 그런 건가요? 그리고 재귀함수에서 동작이 이해가 안 가는 게 있는데 재귀함수 recur() 안에서 return a.then()을 하면 결국 Promise를 반환하는 거니깐 거기서 재귀가 끝나게 되는 거 아닌가요? a.then() 안에서 recur()를 호출한다 하더라도 처음에 실행했던 recur()와는 별개로 동작하는 것처럼 보이는데 실행 흐름이 어떻게 되는지 궁금합니다. 제 생각에는 만약 take에 넘어오는 이터러블이 [Promise.resolve(1), Promise.resolve(2), Promise.resolve(3)]이고, take(2)를 했을 때, 재귀를 다 돌고 최종적으로 return 되는 값이 Promise.resolve(1).then(() => Promise.resolve(2).then(() => [1, 2])) 이런 식으로 될 것 같은데 이게 맞나요?
-
미해결함수형 프로그래밍과 JavaScript ES6+
take 내부의 이터레이터 클로저에 대해
while (!(cur = iter.next()).done) { let a = cur.value; 를 for (const a of iter) { 로 바꾸면 비동기상황에서 iter를 기억하지 못해서 하나만 take하게 되더라구요. 두 문법이 같은 걸로 알고있는데 for of 내부의 이터레이터는 클로저로 사용될수없나요? 이런경우엔 while밖에 쓸수없는건가요? 클로저로 사용되려면 함수내부에서 표현식 안에 갖혀있어야된다는 조건? 같은게 있나요?
-
미해결함수형 프로그래밍과 JavaScript ES6+
products가 사라져도 왜 괜찮은지 모르겠어요....
curry 함수에 의해서 products =>filter(p=>p.price <20000, products) 가 products ⇒ filter(p⇒p.price <2000)(products) 가 되는 것은 이해하였습니다. 다만 어째서 products ⇒ filter(p⇒p.price <2000)(products) 가 filter(p⇒p.price <2000) 랑 같은 것인지는 이해가 되지 않습니다. 모양 자체도 (인자) ⇒ (실행할 함수) 의 모양에서 아예 (함수) 의 모양으로만 바뀌었는데, 이렇게 될 경우 인자를 주지도 않고 작동하는 함수? 처럼 보입니다. 혹시 go 함수의 reduce 함수 자체가 이미 f(acc, a)를 할때 f(products, filter(....)) 와 같은 모양이 되기에 그런것일 까요?
-
미해결함수형 프로그래밍과 JavaScript ES6+ 응용편
e를 구조분해를 통해 값을 불변적으로 다룰수있다는 것에 대해 궁금합니다
e를 통해 접근하면 웹 api가 e를 null로 초기화해버려 접근할 수 없게된다는 게 잘 이해가 되지않는데요. 이벤트 객체 e의 경우에는 웹 api가 콜스택이 끝나면 e를 null로 초기화하기 때문에 이벤트리스너가 비동기적 상황에서 e에 대한 클로저로 사용될수 없는건가요? 즉, 구조분해를 통해 이벤트객체가 아닌 currentTarget만 따로 뽑아서 클로저로 사용한다. 이런 뜻이 맞나요?